package coc.core;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import coo.base.util.StringUtils;

/**
 * 采集数据通用结构类。
 */
public class Data extends LinkedHashMap<String, Object> {
	/** 验证时不包括的属性名 */
	private List<String> validExcludes = new ArrayList<String>();
	/** 去重键值 */
	private String distinctKey;

	/**
	 * 设置属性值。
	 * 
	 * @param name
	 *            属性名
	 * @param value
	 *            属性值
	 */
	public void set(String name, Object value) {
		put(name, value);
	}

	/**
	 * 设置列表属性值。
	 * 
	 * @param name
	 *            列表属性名
	 * @param data
	 *            属性值
	 */
	@SuppressWarnings("unchecked")
	public void setToList(String name, Object data) {
		ArrayList<Object> dataList = (ArrayList<Object>) get(name);
		if (dataList == null) {
			dataList = new ArrayList<Object>();
			put(name, dataList);
		}
		// 如果加到列表中的元素是Data类型，则进行验证加入
		if (data instanceof Data) {
			if (((Data) data).isValid()) {
				dataList.add(data);
			}
		} else {
			dataList.add(data);
		}
	}

	/**
	 * 检测数据是否有效。默认每个属性都不允许为空值。
	 * 
	 * @return 如果数据有效返回true，否则返回false。
	 */
	public Boolean isValid() {
		for (String name : keySet()) {
			if (!validExcludes.contains(name)) {
				Object value = get(name);
				if (value == null || StringUtils.isBlank(value.toString())) {
					return false;
				}
			}
		}
		return true;
	}

	/**
	 * 添加检测数据时要忽略的属性名。
	 * 
	 * @param name
	 *            属性名
	 */
	public void addValidExclude(String name) {
		validExcludes.add(name);
	}

	public String getDistinctKey() {
		return distinctKey;
	}

	public void setDistinctKey(String distinctKey) {
		this.distinctKey = distinctKey;
	}
}